#include "bib_Abrir_Configuracion.h"

extern CONFIG_EST config;

static int obtenerConfiguracion(char *cadena);		/*Coloca cadena en el miembro correcto de la variable global (lo convierte si es valor numerico)*/
static int ValidaPuerto(int);		/*Valida que el puerto se encuentre en un rango correcto*/

int abrirConfiguracion(void){
	char cadenaLeida[TAM_MAX];
	HANDLE archivo;
	
	config.nivelLog = 4;
	
	if (abrirArchivo(&archivo, ARCHIVO_CONFIGURACION, GENERIC_READ, OPEN_EXISTING)){
		imprimirLog(ERROR, "No se pudo abrir el archivo de configuracion", ARCHIVO_CONFIGURACION);
		return EXIT_FAILURE;
	}
	imprimirLog(DEBUG, "Archivo de configuracion abierto", "");
	
	if (leerLinea(archivo, cadenaLeida))
		return EXIT_FAILURE;
	
	while (*cadenaLeida != '\0'){
		if (obtenerConfiguracion(cadenaLeida))
			return EXIT_FAILURE;
		if (leerLinea(archivo, cadenaLeida))
			return EXIT_FAILURE;
	}
	
	if (liberarHandle(archivo))
		return EXIT_FAILURE;
	
	imprimirLog(DEBUG, "Archivo de configuracion cerrado", "");
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
static int ValidaPuerto(int puerto){
	if (puerto < 0){
		imprimirLog(ERROR, "Numero de puerto Invalido", "");
		return EXIT_FAILURE;
	}

	if (puerto < 1024){
		imprimirLog(WARNING, "El numero de puerto debe ser mayor a 1024", "");
		return EXIT_SUCCESS;
	}
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
static int obtenerConfiguracion(char * cadena){
	char *ptr, *pszValor;
	char tokens[2 + 1] = "=\n";
	ptr = strtok(cadena, tokens);
	pszValor = strtok(NULL, tokens);
	
	if (!strcmp("NivelLog", ptr)){  /*Debe ser 4 o mas para que muestre todos los tipos de log */
		config.nivelLog = atoi(pszValor);
		if (config.nivelLog < 0)
			imprimirLog(WARNING, "El nivel de detalle minimo es 1.", "VERIFIQUE LA CONFIGURACION!");
		else 
			imprimirLog(INFO, "Nivel del Log:", pszValor);
	}
			
	else if (!strcmp("Nombre", ptr)){
		strcpy(config.nombre, pszValor);
		imprimirLog(INFO, "Nombre:", pszValor);
	}
	
	else if (!strcmp("KSS_IP", ptr)){
		strcpy(config.IPKSS, pszValor);
		imprimirLog(INFO, "IP del KSS:", pszValor);
	}
	
	else if (!strcmp("KSS_Puerto", ptr)){
		config.puertoKSS = atoi(pszValor);
		if (ValidaPuerto(config.puertoKSS))
			return EXIT_FAILURE;
		imprimirLog(INFO, "Puerto Del KSS:", pszValor);
	}
	
	else if (!strcmp("Cilindros", ptr)){
		config.cilindros = atoi(pszValor);
		////Validar valor
		imprimirLog(INFO, "Cant. de cilindros:", pszValor);
	}
	
	else if (!strcmp("Sectores", ptr)){
		config.sectores = atoi(pszValor);
		////Validar valor
		imprimirLog(INFO, "Cant. de sectores por cilindro:", pszValor);
	}
	
	else if (!strcmp("RPM", ptr)){
		config.RPM = atoi(pszValor);
		////Validar valor
		imprimirLog(INFO, "RPM:", pszValor);
	}

	else if (!strcmp("Cache", ptr)){
		if (atoi(pszValor)){
			config.cache = 1;		//Verdadero
			imprimirLog(INFO, "Cache Activado:", pszValor);
		}else{
			config.cache = 0;		//Falso
			imprimirLog(INFO, "Cache Desactivado:", pszValor);
		}
	}

	else if (!strcmp("Cabezales", ptr)){
		config.cabezales = atoi(pszValor);
		////Validar valor
		imprimirLog(INFO, "Cant. de cabezales: ", pszValor);
	}

	else
		imprimirLog(WARNING, "Parametro invalido ingresado en la configuracion:", ptr);

	return EXIT_SUCCESS;
}